/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：CommandAdd.js<br>
 * 日期：2016年9月20日<br>
 * 作者: 王志远<br>
 * 功能：添加命令<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

window.makeNamespace(window,"Rainier.UI.V2");

/**
 * 类型名称：Rainier.UI.V2.CommandAdd<br>
 * 类型功能：添加元件命令<br>
 */
Rainier.UI.V2.CommandAdd = draw2d.command.Command.extend({
	
	NAME : "Rainier.UI.V2.CommandAdd",
	
	/**
	 * 函数名称：Rainier.UI.V2.CommandAdd.init<br>
	 * 函数功能：构造函数<br>
	 * 异常信息：无<br>
	 */
	init : function(x,y,createInfo,rootEditPart){
		this._super();
		this.x = x;
		this.y = y;
		
	   	if(this.x% 9 !== 0){
			this.x = this.x - this.x % 9;
		}
		if(this.y % 9 !== 0){
			this.y = this.y - this.y % 9;
		}
		
		this.createInfo   = jQuery.extend(true,{},createInfo);;
		this.rootEditPart = rootEditPart;
		this.createdModel = null;
		this.ports		  = new draw2d.util.ArrayList();
	},
	
    /**
	 * 函数名称：Rainier.UI.V2.CommandMove.canExecute<br>
	 * 函数功能：能否执行<br>
	 * 函数返回：Boolean<br>
	 * 异常信息：无<br>
	 */
    canExecute:function(){
    	if(this.createInfo.modelClass){
    		return true;
    	}else{    		
    		return false;
    	}
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.CommandMove.execute<br>
	 * 函数功能：执行命令<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
    execute:function(){
    	var _this = this;
    	var className = this.createInfo.modelClass;
    	var property  = this.createInfo.modelProperty;
    	var json	  = this.createInfo.json;
    	
    	if(!json){
    		this.createdModel  = eval('new ' + className + "();");
    		if(property){
    			var dummy = jQuery.extend(true,{},property);
    			this.createdModel.property = dummy;
    		}    		
    	}else{
            try{
                var ret = eval(json);
                this.createdModel = Rainier.UI.V2.DeviceModelBuilder.buildModel(ret);
            }
            catch(e){
                console.log(e);
            }
    	}
		if(this.createdModel){    		
			var inputs   = this.createdModel.getInputPorts();
			var outputs  = this.createdModel.getOutputPorts();
			var hybrids  = this.createdModel.getHybridPorts();
			
			inputs.each(function(i,p){
				_this.ports.add(p);
			});
			outputs.each(function(i,p){
				_this.ports.add(p);
			});
			hybrids.each(function(i,p){
				_this.ports.add(p);
			});
		}
		var start = new Date().getTime();
    	this.rootEditPart.getModel().addChildModel(this.createdModel);
    	var end = new Date().getTime();
    	
    	console.log("add model cost:" + (end - start));
    	
    	this.createdModel.setPosition(this.x,this.y,false);
    	// this.rootEditPart.exitCreateState();	//只针对福大项目；；；
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.CommandMove.undo<br>
	 * 函数功能：取消操作命令<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
    undo:function(){
    	this.rootEditPart.getModel().removeChildModel(this.createdModel);
    },

    /**
	 * 函数名称：Rainier.UI.V2.CommandMove.redo<br>
	 * 函数功能：重做命令<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
    redo:function(){
    	if(this.createdModel){
			this.ports.each($.proxy(function(j,c){
				this.createdModel.addPort(c);
			},this));
			this.rootEditPart.getModel().addChildModel(this.createdModel);
    		this.createdModel.setPosition(this.x,this.y,false);    		
    	}
    }
});

